package com.gameplatform.util;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceFactory;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {

    private static DruidDataSource dataSource;


//    static {
//        try {
//            Properties props = new Properties();
//            props.setProperty("driverClassName", "com.mysql.cj.jdbc.Driver");
//            props.setProperty("url", "jdbc:mysql://localhost:3306/game_platform?useSSL=false&serverTimezone=UTC&characterEncoding=utf8&allowPublicKeyRetrieval=true");
//            props.setProperty("username", "root");
//            props.setProperty("password", "123456"); // 直接写密码，跳过配置文件
//
//            System.out.println("使用硬编码配置创建数据源...");
//            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(props);
//        } catch (Exception e) {
//            System.err.println("初始化数据源失败: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }

//    static {
//        try (InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties")) {
//            if (is == null) {
//                throw new IOException("找不到 db.properties 配置文件");
//            }
//
//            Properties props = new Properties();
//            props.load(is);
//
//            // 打印加载的配置（关键调试点）
//            System.out.println("数据库配置加载成功:");
//            System.out.println("  url: " + props.getProperty("url"));
//            System.out.println("  username: " + props.getProperty("username"));
//            System.out.println("  password: " + (props.getProperty("password") != null ? "********" : "null"));
//
//            // 额外打印原始密码（仅用于调试，生产环境删除）
//            System.out.println("  原始密码: " + props.getProperty("password"));
//
//            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(props);
//        } catch (Exception e) {
//            System.err.println("初始化数据源失败: " + e.getMessage());
//            e.printStackTrace();
//        }
//    }


    static {
        try (InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("db.properties")) {
            if (is == null) {
                throw new IOException("无法加载数据库配置文件 db.properties");
            }

            Properties props = new Properties();
            props.load(is);

            // 打印加载的配置（用于调试）
            System.out.println("数据库配置加载成功:");
            System.out.println("  driver: " + props.getProperty("driverClassName"));
            System.out.println("  URL: " + props.getProperty("url"));
            System.out.println("  Username: " + props.getProperty("username"));
            System.out.println("  Password: " + (props.getProperty("password") != null ? "********" : "null"));
            // 仅用于调试，生产环境必须删除！
            System.out.println("  明文密码(仅调试用): " + props.getProperty("password"));
            System.out.println(DruidDataSourceFactory.createDataSource(props));
            // 创建数据源
            dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(props);

            // 打印数据源配置（用于调试）
            System.out.println("数据源配置:");
            System.out.println("  初始连接数: " + dataSource.getInitialSize());
            System.out.println("  最大连接数: " + dataSource.getMaxActive());
            System.out.println("  最大等待时间: " + dataSource.getMaxWait());

        } catch (IOException e) {
            System.err.println("加载数据库配置文件失败: " + e.getMessage());
            e.printStackTrace();
            throw new ExceptionInInitializerError("数据库配置文件加载失败: " + e.getMessage());
        } catch (Exception e) {
            System.err.println("初始化数据源失败: " + e.getMessage());
            e.printStackTrace();
            throw new ExceptionInInitializerError("数据源初始化失败: " + e.getMessage());
        }
    }

    /**
     * 获取数据库连接
     * @return 数据库连接对象
     * @throws SQLException 如果获取连接失败
     */
    public static Connection getConnection() throws SQLException {
        if (dataSource == null) {
            throw new SQLException("数据源未初始化，请检查 db.properties 配置文件");
        }

        // 检查数据源状态
        if (dataSource.isClosed()) {
            throw new SQLException("数据源已关闭");
        }

        return dataSource.getConnection();
    }

    /**
     * 关闭数据库连接
     * @param conn 要关闭的连接
     */
    public static void closeConnection(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                System.err.println("关闭数据库连接失败: " + e.getMessage());
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取数据源状态信息
     * @return 数据源状态字符串
     */
    public static String getDataSourceStatus() {
        if (dataSource == null) {
            return "数据源未初始化";
        }

        return String.format("数据源状态: 活跃连接数=%d, 空闲连接数=%d, 已关闭=%b",
                dataSource.getActiveCount(),
                dataSource.getPoolingCount(),
                dataSource.isClosed());
    }

    public static void main(String[] args) {
        try {
            Connection connection = DBUtil.getConnection();
            System.out.println(connection);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
}